package main

import "fmt"

// type Cat struct{}

// func (c Cat) Say() string { return "喵喵喵" }

// type Dog struct{}

// func (d Dog) Say() string { return "汪汪汪" }

// Sayer 接口
type Sayer interface {
	say()
}

type Mover interface {
	move()
}

type dog struct{}

type cat struct{}

// dog实现了Sayer接口
func (d dog) say() {
	fmt.Println("汪汪汪")
}

func (d dog) move() {
	fmt.Println("狗会动")
}

// func (d *dog) move() {
// 	fmt.Println("狗会动")
// }

// cat实现了Sayer接口
func (c cat) say() {
	fmt.Println("喵喵喵")
}

type People interface {
	Speak(string) string
}

type Student struct{}

func (stu *Student) Speak(think string) (talk string) {
	if think == "sb" {
		talk = "你是个大帅比"
	} else {
		talk = "您好"
	}
	return
}

func greeting(p People) {
	t := p.Speak("hello")
	fmt.Println(t)
}

func main() {
	// c := Cat{}
	// fmt.Println("猫:", c.Say())
	// d := Dog{}
	// fmt.Println("狗:", d.Say())

	// var x Sayer // 声明一个Sayer类型的变量x
	// a := cat{}  // 实例化一个cat
	// b := dog{}  // 实例化一个dog
	// x = a       // 可以把cat实例直接赋值给x
	// x.say()     // 喵喵喵
	// x = b       // 可以把dog实例直接赋值给x
	// x.say()     // 汪汪汪

	// 语法糖
	// var a Sayer = cat{}
	// a.say()

	// var x Mover
	// var wangcai = dog{} // 旺财是dog类型
	// x = wangcai         // x可以接收dog类型
	// x.move()
	// var fugui = &dog{} // 富贵是*dog类型
	// x = fugui          // x可以接收*dog类型
	// x.move()

	s := Student{}
	greeting(&s)

	// var peo People = Student{}
	// think := "bitch"
	// fmt.Println(peo.Speak(think))

	// // 定义一个空接口x
	// var x interface{}
	// s := "pprof.cn"
	// x = s
	// fmt.Printf("type:%T value:%v\n", x, x)
	// i := 100
	// x = i
	// fmt.Printf("type:%T value:%v\n", x, x)
	// b := true
	// x = b
	// fmt.Printf("type:%T value:%v\n", x, x)

	// var studentInfo = make(map[string]interface{})
	// studentInfo["name"] = "李白"
	// studentInfo["age"] = 18
	// studentInfo["married"] = false
	// fmt.Println(studentInfo)
	// fmt.Println(studentInfo["name"])

}
